home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / dev / c / restracklib_0_2.lha / ResTrackLib / restrack.c < prev    next >
C/C++ Source or Header  |  1994-07-31  |  21KB  |  901 lines

  1. /******************************************************************************
  2.  
  3.     MODUL
  4.     restrack.c
  5.  
  6.     DESCRIPTION
  7.  
  8.     NOTES
  9.  
  10.     BUGS
  11.  
  12.     TODO
  13.  
  14.     EXAMPLES
  15.  
  16.     SEE ALSO
  17.  
  18.     INDEX
  19.  
  20.     HISTORY
  21.     23. Jul 1994    Optimizer   created
  22.  
  23. ******************************************************************************/
  24.  
  25. /**************************************
  26.         Includes
  27. **************************************/
  28. #include <stdio.h>
  29. #include <exec/lists.h>
  30. #include "lists.h"
  31.  
  32. #include <clib/exec_protos.h>
  33. #include <clib/dos_protos.h>
  34. #ifdef REGARGS
  35. #   include <pragmas/exec_pragmas.h>
  36. #   include <pragmas/dos_pragmas.h>
  37.  
  38. extern struct Library * DOSBase;
  39. #endif
  40.  
  41. #include "restrack_intern.h"
  42.  
  43.  
  44. /**************************************
  45.         Globale Variable
  46. **************************************/
  47.  
  48.  
  49. /**************************************
  50.       Interne Defines & Strukturen
  51. **************************************/
  52.  
  53.  
  54. /**************************************
  55.        Interne Prototypes
  56. **************************************/
  57. void hFreeMem        (ResourceNode *);
  58. void hFreeVec        (ResourceNode *);
  59. void hClose        (ResourceNode *);
  60. void hUnLock        (ResourceNode *);
  61. void hCloseLibrary  (ResourceNode *);
  62. void hDeallocate    (ResourceNode *);
  63. void hFreeEntry     (ResourceNode *);
  64. void hDeleteMsgPort (ResourceNode *);
  65. void hCloseDevice   (ResourceNode *);
  66.  
  67.  
  68. /**************************************
  69.         Interne Variable
  70. **************************************/
  71. LONG  ResourceTrackingLevel;
  72. ULONG ResourcesToTrack;
  73.  
  74. static struct MinList ResourceList = InitMinList (ResourceList);
  75.  
  76. const ResourceHandler Handler[] =
  77. {
  78.     /* RLTRT_AllocMem */    hFreeMem,        "AllocMem()",       "%d Bytes",
  79.     /* RTLRT_AllocVec */    hFreeVec,        "AllocVec()",       "%d Bytes",
  80.     /* RTLRT_Open */        hClose,        "Open()",           "",
  81.     /* RTLRT_Lock */        hUnLock,        "Lock()",           "",
  82.     /* RTLRT_OpenLibrary */ hCloseLibrary,  "OpenLibrary()",    "%s",
  83.     /* RTLRT_Allocate */    hDeallocate,    "Allocate()",       "%d Bytes",
  84.     /* RTLRT_AllocEntry */  hFreeEntry,     "AllocEntry()",     "",
  85.     /* RTLRT_MsgPort */     hDeleteMsgPort, "CreateMsgPort()",  "",
  86.     /* RTLRT_IORequest */   hCloseDevice,   "OpenDevice()",     "Unit %d",
  87. #if 0
  88.     /* RTLRT_Pool */        hDeletePool,    "Memory Pool",      "",
  89. #endif
  90. };
  91.  
  92.  
  93. /*****************************************************************************
  94.  
  95.     NAME
  96.     StartResourceTracking -- initialize resource tracking
  97.  
  98.     SYNOPSIS
  99.     void StartResourceTracking (ULONG flags);
  100.  
  101.     FUNCTION
  102.     Initializes resource tracking for the specified resources. You
  103.     can allocate resources before this call, but they won't be tracked.
  104.     You MUST NOT set the ResourceTrackingLevel, though.
  105.  
  106.     INPUTS
  107.     flags - specifies the resources to be tracked. You can specify
  108.         RTL_NOTRACK to track all BUT the specified resources, ie.
  109.         RTL_NOTRACK|RTL_DOS will track every resource but those in
  110.         DOS (eg. Open(), Close(), etc.).
  111.  
  112.             RTL_TRACK        Track the specified resources (just
  113.                     for completeness, can be left out).
  114.             RTL_NOTRACK     Track all but the specified resources.
  115.             RTL_ALL        Track all known resources
  116.  
  117.             RTL_CLIB        include/exclude c.lib
  118.             RTL_DOS        dito for DOS.library
  119.             RTL_EXEC        dito for exec.library
  120.  
  121.     RESULT
  122.     none.
  123.  
  124.     NOTES
  125.     It is legal to allocate resources before the call of this function.
  126.     These resources won't show up in the list of tracked resources.
  127.  
  128.     EXAMPLE
  129.     StartResourceTracking (RTL_EXEC);       // Track exec stuff
  130.  
  131.     AllocMem (6543,0);
  132.     Open ("ram:tmp", MODE_OLDFILE);
  133.  
  134.     PrintTrackedResources ();               // shows only the allocmem
  135.     EndResourceTracking ();     // prints an error for the allocmem and
  136.                     // frees the memory. The file is ignored.
  137.  
  138.     BUGS
  139.     You system may crash if you set the ResourceTrackingLevel > 0
  140.     before you call this function.
  141.  
  142.     The library uses several global variables. You programs can be
  143.     made resident with DICE and SAS/C but you loose a couple of bytes
  144.     in the data segment.
  145.  
  146.     The names for the functions in this library are too long.
  147.  
  148.     SEE ALSO
  149.     PrintTrackedResources(), EndResourceTracking().
  150.  
  151.     INTERNALS
  152.  
  153.     HISTORY
  154.     23. Jul 1994    Optimizer   created
  155.  
  156. ******************************************************************************/
  157.  
  158. void StartResourceTracking (ULONG flags)
  159. {
  160.     /* get the resources to track */
  161.     if (flags & RTL_NOTRACK)
  162.     flags = ~flags;
  163.  
  164.     ResourcesToTrack      = flags;
  165.     ResourceTrackingLevel = 1;
  166. } /* StartResourceTracking */
  167.  
  168.  
  169. /*****************************************************************************
  170.  
  171.     NAME
  172.     SetResourceTracking -- initialize resource tracking
  173.  
  174.     SYNOPSIS
  175.     void SetResourceTracking (ULONG flags);
  176.  
  177.     FUNCTION
  178.     Changes resource tracking for the specified resources. All previously
  179.     allocated and tracked resources are still tracked after this, but
  180.     no resource not in <flags> will be tracked after this call.
  181.     You didn't understand ? No wonder :-) Look:
  182.  
  183.         // Track DOS-stuff
  184.         StartResourceTracking (RTL_DOS);
  185.  
  186.         // lock a file. The AllocMem below is not tracked
  187.         lock = Lock (file);
  188.         mem = AllocMem (500,0);
  189.  
  190.         // Now we stop DOS-tracking and start EXEC-tracking
  191.         SetResourceTracking (RTL_EXEC);
  192.  
  193.         // The AllocMem before is still not in the list, but the
  194.         // lock is now removed from the list of tracked resources
  195.         UnLock (lock);
  196.         lock = Lock (file);     // this new lock is NOT tracked
  197.  
  198.         mem = AllocMem (500,0); // this IS tracked
  199.  
  200.         SetResourceTracking (RTL_DOS);
  201.  
  202.         // The list of tracked resources does only contain the
  203.         // AllocMem now. The lock is lost.
  204.  
  205.         EndResourceTracking ();
  206.  
  207.     INPUTS
  208.     flags - specifies the resources to be tracked. You can specify
  209.         RTL_NOTRACK to track all BUT the specified resources, ie.
  210.         RTL_NOTRACK|RTL_DOS will track every resource but those in
  211.         DOS (eg. Open(), Close(), etc.).
  212.  
  213.             RTL_TRACK        Track the specified resources (just
  214.                     for completeness, can be left out).
  215.             RTL_NOTRACK     Track all but the specified resources.
  216.             RTL_ALL        Track all known resources
  217.  
  218.             RTL_CLIB        include/exclude c.lib
  219.             RTL_DOS        dito for DOS.library
  220.             RTL_EXEC        dito for exec.library
  221.  
  222.     RESULT
  223.     none.
  224.  
  225.     NOTES
  226.     It is legal to allocate resources before the call of this function.
  227.     These resources won't show up in the list of tracked resources.
  228.  
  229.     EXAMPLE
  230.     SetResourceTracking (RTL_EXEC);       // Track exec stuff
  231.  
  232.     AllocMem (6543,0);
  233.     Open ("ram:tmp", MODE_OLDFILE);
  234.  
  235.     PrintTrackedResources ();               // shows only the allocmem
  236.     EndResourceTracking ();     // prints an error for the allocmem and
  237.                     // frees the memory. The file is ignored.
  238.  
  239.     BUGS
  240.  
  241.     SEE ALSO
  242.     StartResourceTracking(), PrintTrackedResources(),
  243.     EndResourceTracking().
  244.  
  245.     INTERNALS
  246.  
  247.     HISTORY
  248.     23. Jul 1994    Optimizer   created
  249.  
  250. ******************************************************************************/
  251.  
  252. void SetResourceTracking (ULONG flags)
  253. {
  254.     /* get the resources to track */
  255.     if (flags & RTL_NOTRACK)
  256.     flags = ~flags;
  257.  
  258.     ResourcesToTrack = flags;
  259.  
  260. } /* SetResourceTracking */
  261.  
  262.  
  263. /*****************************************************************************
  264.  
  265.     NAME
  266.     PrintTrackedResources
  267.  
  268.     SYNOPSIS
  269.     void PrintTrackedResources (void);
  270.  
  271.     FUNCTION
  272.     Terminates the resource tracking. All resources that are allocated
  273.     at this time are printed out and freed. You may start resource
  274.     tracking again after this call by calling StartResourceTracking()
  275.     again.
  276.  
  277.     INPUTS
  278.     none.
  279.  
  280.     RESULT
  281.     none.
  282.  
  283.     NOTES
  284.  
  285.     EXAMPLE
  286.     StartResourceTracking (RTL_EXEC);       // Track exec stuff
  287.  
  288.     AllocMem (6543,0);
  289.     Open ("ram:tmp", MODE_OLDFILE);
  290.  
  291.     PrintTrackedResources ();               // shows only the allocmem
  292.     EndResourceTracking ();     // prints an error for the allocmem and
  293.                     // frees the memory. The file is ignored.
  294.  
  295.     BUGS
  296.  
  297.     SEE ALSO
  298.     PrintTrackedResources(), StartResourceTracking().
  299.  
  300.     INTERNALS
  301.  
  302.     HISTORY
  303.     23. Jul 1994    Optimizer   created
  304.  
  305. ******************************************************************************/
  306.  
  307. #define PRINTLISTHEADER fprintf (stderr, "%-20s %20s \t %s\n", "Resource", "Where", "Comment")
  308.  
  309. void PrintTrackedResources (void)
  310. {
  311.     ResourceNode * node;
  312.  
  313.     fprintf (stderr, "These resources are currently tracked:\n");
  314.     PRINTLISTHEADER;
  315.  
  316.     if (node=GetHead(&ResourceList))
  317.     {
  318.     for ( ; node; node=GetSucc(node))
  319.         PrintResourceNode (node);
  320.     }
  321.     else
  322.     fprintf (stderr, "--- none ---\n");
  323.  
  324. } /* PrintTrackedResources */
  325.  
  326.  
  327. /*****************************************************************************
  328.  
  329.     NAME
  330.     SetResourceTrackingLevel
  331.  
  332.     SYNOPSIS
  333.     LONG oldlevel = SetResourceTrackingLevel (LONG newlevel);
  334.  
  335.     FUNCTION
  336.     This sets the ResourceTrackingLevel to the specified value.
  337.     If <newlevel> is < 0, then no resource tracking will happen
  338.     until the value is raised above 0. Use this function to
  339.     temporarily disable resource tracking.
  340.  
  341.     INPUTS
  342.     newlevel - the new level. If this is < 0, no resource tracking
  343.         takes place.
  344.  
  345.     RESULT
  346.     The old value of ResourceTrackingLevel. Just in case you
  347.     want to restore it later.
  348.  
  349.     NOTES
  350.     All resources allocated while ResourceTrackingLevel < 0 are not
  351.     tracked, but resources freed during this time are still removed
  352.     from the list of tracked resources.
  353.  
  354.     EXAMPLE
  355.     // Ask for the current value if ResourceTrackingLevel ... *ahem*
  356.     SetResourceTrackingLevel (val = SetResourceTrackingLevel (0));
  357.  
  358.     BUGS
  359.  
  360.     SEE ALSO
  361.  
  362.     INTERNALS
  363.  
  364.     HISTORY
  365.     23. Jul 1994    Optimizer   created
  366.  
  367. ******************************************************************************/
  368.  
  369. LONG SetResourceTrackingLevel (LONG newlevel)
  370. {
  371.     LONG old;
  372.  
  373.     old = ResourceTrackingLevel;
  374.     ResourceTrackingLevel = newlevel;
  375.  
  376.     return (old);
  377. } /* SetResourceTrackingLevel */
  378.  
  379.  
  380. /*****************************************************************************
  381.  
  382.     NAME
  383.     IncResourceTrackingLevel
  384.  
  385.     SYNOPSIS
  386.     LONG oldlevel = IncResourceTrackingLevel (void);
  387.  
  388.     FUNCTION
  389.     This increments the ResourceTrackingLevel by one. If <oldlevel> is
  390.     < 0, then no resource tracking will happen until the value is
  391.     raised above 0. Use this function to temporarily disable resource
  392.     tracking and when you need nesting.
  393.  
  394.     INPUTS
  395.     none.
  396.  
  397.     RESULT
  398.     The old value of ResourceTrackingLevel. If it is >= 0, then
  399.     resource tracking takes place now.
  400.  
  401.     NOTES
  402.     All resources allocated while ResourceTrackingLevel < 0 are not
  403.     tracked, but resources freed during this time are still removed
  404.     from the list of tracked resources.
  405.  
  406.     EXAMPLE
  407.  
  408.     BUGS
  409.  
  410.     SEE ALSO
  411.  
  412.     INTERNALS
  413.  
  414.     HISTORY
  415.     23. Jul 1994    Optimizer   created
  416.  
  417. ******************************************************************************/
  418.  
  419. LONG IncResourceTrackingLevel (void)
  420. {
  421.     return (ResourceTrackingLevel ++);
  422.  
  423. } /* IncResourceTrackingLevel */
  424.  
  425.  
  426. /*****************************************************************************
  427.  
  428.     NAME
  429.     DecResourceTrackingLevel
  430.  
  431.     SYNOPSIS
  432.     LONG oldlevel = DecResourceTrackingLevel (void);
  433.  
  434.     FUNCTION
  435.     This decrements the ResourceTrackingLevel by one. If <oldlevel> is
  436.     <= 1, then no resource tracking will happen until the value is
  437.     raised above 0. Use this function to temporarily disable resource
  438.     tracking and when you need nesting.
  439.  
  440.     INPUTS
  441.     none.
  442.  
  443.     RESULT
  444.     The old value of ResourceTrackingLevel. If it is <= 1, then
  445.     resource tracking is now disabled.
  446.  
  447.     NOTES
  448.     All resources allocated while ResourceTrackingLevel < 0 are not
  449.     tracked, but resources freed during this time are still removed
  450.     from the list of tracked resources.
  451.  
  452.     EXAMPLE
  453.  
  454.     BUGS
  455.  
  456.     SEE ALSO
  457.  
  458.     INTERNALS
  459.  
  460.     HISTORY
  461.     23. Jul 1994    Optimizer   created
  462.  
  463. ******************************************************************************/
  464.  
  465. LONG DecResourceTrackingLevel (void)
  466. {
  467.     return (ResourceTrackingLevel --);
  468.  
  469. } /* DecResourceTrackingLevel */
  470.  
  471.  
  472. /*****************************************************************************
  473.  
  474.     NAME
  475.     EndResourceTracking
  476.  
  477.     SYNOPSIS
  478.     void EndResourceTracking (void);
  479.  
  480.     FUNCTION
  481.     Terminates the resource tracking. All resources that are allocated
  482.     at this time are printed out and freed. You may start resource
  483.     tracking again after this call by calling StartResourceTracking()
  484.     again.
  485.  
  486.     INPUTS
  487.     none.
  488.  
  489.     RESULT
  490.     none.
  491.  
  492.     NOTES
  493.  
  494.     EXAMPLE
  495.     StartResourceTracking (RTL_EXEC);       // Track exec stuff
  496.  
  497.     AllocMem (6543,0);
  498.     Open ("ram:tmp", MODE_OLDFILE);
  499.  
  500.     PrintTrackedResources ();               // shows only the allocmem
  501.     EndResourceTracking ();     // prints an error for the allocmem and
  502.                     // frees the memory. The file is ignored.
  503.  
  504.     BUGS
  505.  
  506.     SEE ALSO
  507.     PrintTrackedResources(), StartResourceTracking().
  508.  
  509.     INTERNALS
  510.  
  511.     HISTORY
  512.     23. Jul 1994    Optimizer   created
  513.  
  514. ******************************************************************************/
  515.  
  516. void EndResourceTracking (void)
  517. {
  518.     ResourceNode * node, * next;
  519.  
  520.     if (node=GetHead(&ResourceList))
  521.     {
  522.     fprintf (stderr, "These resources were still allocted when "
  523.              "EndResourceTracking was called:\n");
  524.     PRINTLISTHEADER;
  525.  
  526.     for ( ; node; node=next)
  527.     {
  528.         next = GetSucc (node);
  529.  
  530.         PrintResourceNode (node);
  531.         (*(Handler[node->Resource].FreeResource)) (node);
  532.         RemoveResourceNode (node);
  533.     }
  534.     }
  535.  
  536.     ResourceTrackingLevel = 0;       /* Stop resource tracking */
  537.  
  538. } /* EndResourceTracking */
  539.  
  540.  
  541. /*****************************************************************************
  542.  
  543.     NAME
  544.     AddResourceNode -- add a new resource to the list
  545.  
  546.     SYNOPSIS
  547.     void AddResourceNode (const char * file, WORD line, WORD resource,
  548.             APTR ptr, LONG l);
  549.  
  550.     FUNCTION
  551.     Creates a new node in the resource list. If there is not enough
  552.     memory for this operation, the call will do nothing.
  553.  
  554.     INPUTS
  555.     file - name of the file in which the resouce was allocated
  556.         (__FILE__).
  557.     line - the line in the file (__LINE__).
  558.     Data0, Data1 - int or ptr describing the resource
  559.  
  560.     RESULT
  561.     none.
  562.  
  563.     NOTES
  564.  
  565.     EXAMPLE
  566.     AddResourceNode ("test.c", 24, RES_AllocMem, ptr, 500);
  567.  
  568.     BUGS
  569.  
  570.     SEE ALSO
  571.     FindResourceNode1(), FindResourceNode2(), RemoveResourceNode()
  572.  
  573.     INTERNALS
  574.  
  575.     HISTORY
  576.     23. Jul 1994    Optimizer   created
  577.  
  578. ******************************************************************************/
  579.  
  580. void AddResourceNode (const char * file, WORD line, WORD resource, APTR ptr,
  581.               LONG l)
  582. {
  583.     ResourceNode * node;
  584.  
  585.     if ( (node = AllocMem (sizeof (ResourceNode), 0)) )
  586.     {
  587.     node->File     = file;
  588.     node->Line     = line;
  589.     node->Resource = resource;
  590.     node->Ptr      = ptr;
  591.     node->Long     = l;
  592.  
  593.     /* Add node to the head. This ensures that we clean up in the
  594.        opposite direction as we got the resources */
  595.     AddHead ((struct List *)&ResourceList, (struct Node *)node);
  596.     }
  597. } /* AddResourceNode */
  598.  
  599.  
  600. /*****************************************************************************
  601.  
  602.     NAME
  603.     AddResourceNode3 -- add a new resource to the list
  604.  
  605.     SYNOPSIS
  606.     void AddResourceNode2 (const char * file, WORD line, WORD resource,
  607.             APTR ptr, LONG l, APTR ptr2);
  608.  
  609.     FUNCTION
  610.     Creates a new node in the resource list. If there is not enough
  611.     memory for this operation, the call will do nothing.
  612.  
  613.     INPUTS
  614.     file - name of the file in which the resouce was allocated
  615.         (__FILE__).
  616.     line - the line in the file (__LINE__).
  617.     Data0, Data1 - int or ptr describing the resource
  618.  
  619.     RESULT
  620.     none.
  621.  
  622.     NOTES
  623.  
  624.     EXAMPLE
  625.     AddResourceNode3 ("test.c", 24, RES_Allocate, ptr, 500, memlist);
  626.  
  627.     BUGS
  628.  
  629.     SEE ALSO
  630.     AddResourceNode(), FindResourceNode1(), FindResourceNode2(),
  631.     RemoveResourceNode()
  632.  
  633.     INTERNALS
  634.  
  635.     HISTORY
  636.     23. Jul 1994    Optimizer   created
  637.  
  638. ******************************************************************************/
  639.  
  640. void AddResourceNode3 (const char * file, WORD line, WORD resource, APTR ptr,
  641.               LONG l, APTR ptr2)
  642. {
  643.     ResourceNode * node;
  644.  
  645.     if ( (node = AllocMem (sizeof (ResourceNode), 0)) )
  646.     {
  647.     node->File     = file;
  648.     node->Line     = line;
  649.     node->Resource = resource;
  650.     node->Ptr      = ptr;
  651.     node->Long     = l;
  652.     node->Ptr2     = ptr2;
  653.  
  654.     /* Add node to the head. This ensures that we clean up in the
  655.        opposite direction as we got the resources */
  656.     AddHead ((struct List *)&ResourceList, (struct Node *)node);
  657.     }
  658. } /* AddResourceNode3 */
  659.  
  660.  
  661. /*****************************************************************************
  662.  
  663.     NAME
  664.     PrintResourceNode
  665.  
  666.     SYNOPSIS
  667.     void PrintResourceNode (ResourceNode * node);
  668.  
  669.     FUNCTION
  670.     Prints a formatted version of the node to stderr.
  671.  
  672.     INPUTS
  673.     node - The node is nicely formatted and printed.
  674.  
  675.     RESULT
  676.  
  677.     NOTES
  678.  
  679.     EXAMPLE
  680.  
  681.     BUGS
  682.  
  683.     SEE ALSO
  684.  
  685.     INTERNALS
  686.  
  687.     HISTORY
  688.     23. Jul 1994    Optimizer   created
  689.  
  690. ******************************************************************************/
  691.  
  692. void PrintResourceNode (ResourceNode * node)
  693. {
  694.     fprintf (stderr, "%-20s %20s:%d\t",
  695.         Handler[node->Resource].ResourceName, node->File, node->Line);
  696.     fprintf (stderr, Handler[node->Resource].ResourcePrintFmt, node->Long);
  697.     fputc ('\n', stderr);
  698.  
  699. } /* PrintResourceNode */
  700.  
  701.  
  702. /*****************************************************************************
  703.  
  704.     NAME
  705.     FindResourceNode1 -- find a resource with Ptr
  706.  
  707.     SYNOPSIS
  708.     ResourceNode * FindResourceNode1 (APTR ptr);
  709.  
  710.     FUNCTION
  711.     Go through the list of tracked resources and return the first
  712.     node that matches Ptr.
  713.  
  714.     INPUTS
  715.     data0 - Look for this entry
  716.  
  717.     RESULT
  718.     A pointer to the node with node->Ptr == ptr or NULL if no such
  719.     node is found.
  720.  
  721.     NOTES
  722.  
  723.     EXAMPLE
  724.  
  725.     BUGS
  726.  
  727.     SEE ALSO
  728.     AddResourceNode(), FindResourceNode2(), RemoveResourceNode()
  729.  
  730.     INTERNALS
  731.  
  732.     HISTORY
  733.     23. Jul 1994    Optimizer   created
  734.  
  735. ******************************************************************************/
  736.  
  737. ResourceNode * FindResourceNode1 (APTR ptr)
  738. {
  739.     ResourceNode * node;
  740.  
  741.     for (node=GetHead(&ResourceList); node; node=GetSucc(node))
  742.     if (node->Ptr == ptr)
  743.         break;
  744.  
  745.     return (node);
  746. } /* FindResourceNode1 */
  747.  
  748.  
  749. /*****************************************************************************
  750.  
  751.     NAME
  752.     FindResourceNode2 -- find a resource with Data[0] and Data[1]
  753.  
  754.     SYNOPSIS
  755.     ResourceNode * FindResourceNode2 (APTR ptr, LONG l);
  756.  
  757.     FUNCTION
  758.     Go through the list of tracked resources and return the first
  759.     node that matches ptr and l.
  760.  
  761.     INPUTS
  762.     ptr, l - Look for this entry
  763.  
  764.     RESULT
  765.     A pointer to the node with node->Ptr == ptr and node->Long == l or
  766.     NULL if no such node is found.
  767.  
  768.     NOTES
  769.  
  770.     EXAMPLE
  771.  
  772.     BUGS
  773.  
  774.     SEE ALSO
  775.     AddResourceNode(), FindResourceNode1(), RemoveResourceNode()
  776.  
  777.     INTERNALS
  778.  
  779.     HISTORY
  780.     23. Jul 1994    Optimizer   created
  781.  
  782. ******************************************************************************/
  783.  
  784. ResourceNode * FindResourceNode2 (APTR ptr, LONG l)
  785. {
  786.     ResourceNode * node;
  787.  
  788.     for (node=GetHead(&ResourceList); node; node=GetSucc(node))
  789.     if (node->Ptr == ptr && node->Long == l)
  790.         break;
  791.  
  792.     return (node);
  793. } /* FindResourceNode2 */
  794.  
  795.  
  796. /*****************************************************************************
  797.  
  798.     NAME
  799.     RemoveResourceNode
  800.  
  801.     SYNOPSIS
  802.     void RemoveResourceNode (ResourceNode * node);
  803.  
  804.     FUNCTION
  805.     Remove a ResourceNode for the list and free it. The resource that
  806.     is contained in the node is untouched. You are responsible to free
  807.     it yourself.
  808.  
  809.     INPUTS
  810.     node - Remove this node from the list and free it. Must not be NULL.
  811.  
  812.     RESULT
  813.     none.
  814.  
  815.     NOTES
  816.     The node must have been created with AddResourceNode().
  817.  
  818.     EXAMPLE
  819.  
  820.     BUGS
  821.  
  822.     SEE ALSO
  823.     AddResourceNode(), FindResourceNode1(), FindResourceNode2()
  824.  
  825.     INTERNALS
  826.  
  827.     HISTORY
  828.     23. Jul 1994    Optimizer   created
  829.  
  830. ******************************************************************************/
  831.  
  832. void RemoveResourceNode (ResourceNode * node)
  833. {
  834.     Remove ((struct Node *)node);
  835.     FreeMem (node, sizeof (ResourceNode));
  836.  
  837. } /* RemoveResourceNode */
  838.  
  839.  
  840. /******************************************************************************
  841.             Functions to free ResourceNodes
  842. ******************************************************************************/
  843.  
  844. void hFreeMem (ResourceNode * node)
  845. {
  846.     FreeMem (node->Ptr, node->Long);
  847. } /* hFreeMem */
  848.  
  849.  
  850. void hFreeVec (ResourceNode * node)
  851. {
  852.     FreeVec (node->Ptr);
  853. } /* hFreeVec */
  854.  
  855.  
  856. void hCloseLibrary (ResourceNode * node)
  857. {
  858.     CloseLibrary ((struct Library *)node->Ptr);
  859. } /* hCloseLibrary */
  860.  
  861.  
  862. void hDeallocate (ResourceNode * node)
  863. {
  864.     Deallocate ((struct MemHeader *)node->Ptr2, node->Ptr, node->Long);
  865. } /* hDeallocate */
  866.  
  867.  
  868. void hFreeEntry (ResourceNode * node)
  869. {
  870.      FreeEntry ((struct MemList *)node->Ptr);
  871. } /* hFreeEntry */
  872.  
  873.  
  874. void hDeleteMsgPort (ResourceNode * node)
  875. {
  876.      DeleteMsgPort ((struct MsgPort *)node->Ptr);
  877. } /* hDeleteMsgPort */
  878.  
  879.  
  880. void hCloseDevice (ResourceNode * node)
  881. {
  882.      CloseDevice ((struct IORequest *)node->Ptr);
  883. } /* h */
  884.  
  885.  
  886. void hClose (ResourceNode * node)
  887. {
  888.     Close ((BPTR)node->Ptr);
  889. } /* hClose */
  890.  
  891.  
  892. void hUnLock (ResourceNode * node)
  893. {
  894.     UnLock ((BPTR)node->Ptr);
  895. } /* hUnLock */
  896.  
  897.  
  898. /******************************************************************************
  899. *****  ENDE restrack.c
  900. ******************************************************************************/
  901.